package com.swing.panel;

import com.swing.event.KeyInput;
import com.swing.obj.GameObject;
import com.swing.obj.Rect;

import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.ArrayList;
import java.util.List;

/**
 * 游戏面板类，继承自JPanel
 * 用于绘制和管理游戏中的动态元素（如角色、道具等）
 * 作为中间层面板，通常叠加在背景面板之上
 */
public class GamePanel extends JPanel {

    private List<GameObject> gameObjects;

    /**
     * 构造方法：初始化游戏面板
     * 负责面板的布局设置、事件监听注册及游戏对象初始化等工作
     */
    public GamePanel() {
        // 设置布局管理器为BorderLayout
        // 便于后续添加子组件时按方位（东、南、西、北、中）布局
        setLayout(new BorderLayout());

        // 设置面板为透明
        // 关键作用：避免遮挡下层面板（如背景面板），确保背景可见
        setOpaque(false);

        // 为当前面板添加键盘事件监听器
        // 用于捕获并处理键盘输入（按键按下、释放、输入等操作）
        addKeyListener(new KeyInput());

        // 为当前面板添加焦点事件监听器
        // 通过FocusAdapter适配器类简化实现，只需重写需要的方法
        addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                // 当面板获得焦点时触发此方法
                System.out.println("GamePanel获得焦点");
            }

            @Override
            public void focusLost(FocusEvent e) {
                // 当面板失去焦点时触发此方法
                System.out.println("GamePanel失去焦点");
            }
        });

        // 初始化游戏对象集合
        // 用于统一管理和操作游戏中所有的实体对象
        gameObjects = new ArrayList<>();
        // 修改为模拟绘制1个矩形
        for (int i = 0; i < 1; i++) {
            // 向游戏对象集合中添加一个矩形对象
            // 矩形的位置为(60*i, 60*i)，宽高均为60像素
            addGameObject(new Rect(60 * i, 60 * i, 60.f, 60.f));
        }
    }
    public void addGameObject(GameObject gameObject) {
        gameObjects.add(gameObject);
    }

    /**
     * 重写绘图方法，自定义面板内容绘制
     * 该方法会在面板刷新时自动调用，用于绘制游戏元素
     *
     * @param g 绘图上下文对象，提供绘图相关的方法
     */
    @Override
    protected void paintComponent(Graphics g) {
        // 调用父类的paintComponent方法
        // 作用：1. 清除面板原有内容，避免画面残留；2. 执行面板默认的绘制逻辑
        super.paintComponent(g);

        // 遍历游戏对象列表，绘制每个游戏对象
        for (GameObject gameObject : gameObjects) {
            // 绘制游戏对象
            gameObject.render(g);
        }
    }

    public void update(float deltaTime) {
        for (GameObject gameObject : gameObjects) {
            gameObject.update(deltaTime);
        }
    }

    public void render() {
        repaint();
    }
}
    